home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / etc / getpass.c < prev    next >
C/C++ Source or Header  |  1992-03-27  |  1KB  |  49 lines

  1. #if defined(LIBC_SCCS) && !defined(lint)
  2. static char sccsid[] = "@(#)getpass.c    5.2 (Berkeley) 3/9/86";
  3. #endif LIBC_SCCS and not lint
  4. /* Taken from 4.3 BSD;  cannot be redistributed except to people with
  5.  * proper AT&T source licenses. */
  6.  
  7. #include <stdio.h>
  8. #include <signal.h>
  9. #include <sgtty.h>
  10. #include <pwd.h>
  11.  
  12. char *
  13. getpass(prompt)
  14. char *prompt;
  15. {
  16.     struct sgttyb ttyb;
  17.     int flags;
  18.     register char *p;
  19.     register c;
  20.     FILE *fi;
  21.     static char pbuf[_PASSWORD_LEN + 1];
  22.     void (*sig)();
  23.     extern char *getenv();
  24.  
  25.     p = getenv("TTY");
  26.     if ((p != NULL) && ((fi = fopen(p, "r")) != NULL))
  27.         setbuf(fi, (char *)NULL);
  28.     else
  29.         fi = stdin;
  30.     sig = signal(SIGINT, SIG_IGN);
  31.     ioctl(fileno(fi), TIOCGETP, (char *) &ttyb);
  32.     flags = ttyb.sg_flags;
  33.     ttyb.sg_flags &= ~ECHO;
  34.     ioctl(fileno(fi), TIOCSETP, (char *) &ttyb);
  35.     fprintf(stderr, "%s", prompt); fflush(stderr);
  36.     for (p=pbuf; (c = getc(fi))!='\n' && c!=EOF;) {
  37.         if (p < &pbuf[_PASSWORD_LEN])
  38.             *p++ = c;
  39.     }
  40.     *p = '\0';
  41.     fprintf(stderr, "\n"); fflush(stderr);
  42.     ttyb.sg_flags = flags;
  43.     ioctl(fileno(fi), TIOCSETP, (char *) &ttyb);
  44.     signal(SIGINT, sig);
  45.     if (fi != stdin)
  46.         fclose(fi);
  47.     return(pbuf);
  48. }
  49.